home *** CD-ROM | disk | FTP | other *** search
- #include "out.h"
- #ifndef NO_9
- #include <math.h>
- #include <stdio.h>
- #include <string.h>
- #include "all.h"
-
-
- void FET_amp()
- {
-
- struct S_parameters Snew;
- static int run_first_time=0;
- char *filename, what='g';
- struct S device;
- struct s noise;
- static struct components values;
- int swap;
- if(run_first_time==0)
- {
- values.Vcc=12.0;
- values.Vds=3.0;
- values.Vgs=0.1;
- values.f=145.0;
- values.Id=3.0;
- values.Zo=Zo_default;
- run_first_time=1;
- }
- filename=string(0L,20L);
- FET_amp_picture();
- get_FET_data_from_keyboard(filename, &values, &what);
-
- get_FET_data_from_disk(filename, &device, &noise);
-
- Snew=design_FET_amp(device, noise, &values, what, &swap);
- printf("XXXXXX");
- if(swap==FALSE)
- FET_amp_picture();
- else
- FET_amp_picture2();
- print_FET_component_values(values, Snew);
-
- print_noise_parameters(noise,values.Zo);
- free_string(filename,0L,20L);
- values.f/=1e6;
- values.Id*=1000.0;
- }
-
- void FET_amp_picture()
- {
- cls();
- printf(" ----------------Vcc\n");
- printf(" |\n");
- printf(" R2\n");
- printf(" |\n");
- printf(" RFC\n");
- printf(" |\n");
- printf(" |---C2-------X3- O/P\n");
- printf(" | | |\n");
- printf(" G |-----| D | |\n");
- printf("I/P----X1-------| | |\n");
- printf(" | |-----| S R3 X4\n");
- printf(" | | | |\n");
- printf(" | ----|--- | |\n");
- printf(" X2 | | | | |\n");
- printf(" | Cd R1 Cd | |\n");
- printf(" | | | | | |\n");
- printf(" ------------------------------------ Earth \n");
- }
-
- void FET_amp_picture2()
- {
- cls();
- printf(" ----------------Vcc\n");
- printf(" |\n");
- printf(" R2\n");
- printf(" |\n");
- printf(" RFC\n");
- printf(" |\n");
- printf(" |---C2---X3--- O/P\n");
- printf(" G |-----| D | |\n");
- printf("I/P----X1-------| | |\n");
- printf(" | |-----| S R3 X4\n");
- printf(" | | | |\n");
- printf(" | ----|--- | |\n");
- printf(" X2 | | | | |\n");
- printf(" | Cd R1 Cd | |\n");
- printf(" | | | | | |\n");
- printf(" ------------------------------------ Earth \n");
- }
-
- struct S_parameters design_FET_amp(struct S device, struct s noise, struct components *values, char what, int *swap)
- {
- double r, x, theta, Zo;
- double Rload, Xload;
- struct S_and_Z noise_data;
- struct FCOMPLEX input_Z, temp, zout;
- struct S_parameters a,c, S_ip_matching, FET, newS;
- struct S_parameters series_element, parallel_element;
- struct T_parameters b;
- struct S d;
-
- Zo=values->Zo;
-
- values->R1=values->Vgs/values->Id; /* Id in mA */
- values->R2=(values->Vcc-values->Vds-values->Vgs)/values->Id;
- /* Let each Cd have a reactance 1/5 that of R1 */
- values->Cd=5/(2*PI*values->f*values->R1);
- if(what=='N' || what =='n')
- {
- noise_data.s_in_dB=20*log10(noise.mag);
- noise_data.angle=noise.ang;
- convert(2, &noise_data, Zo);
- r=noise_data.z.r;
- x=noise_data.z.i;
- }
- else if(what=='G' || what =='g')
- {
- noise_data.s_in_dB=20*log10(device.s11.mag);
- noise_data.angle=device.s11.ang;
- convert(2, &noise_data,Zo);
- r=noise_data.z.r;
- x=-noise_data.z.i; /* -X, since need to match to complex conjugate */
- }
- calculate_L_network(values->Zo,0.0,r,x,&values->X1_1, &values->X1_2, &values->X2_1, &values->X2_2, swap);
- if(values->X1_1 >= 0.0) /* X1 inductive */
- {
- values->L1_1=values->X1_1/(2*PI*values->f);
- values->C2_1=-1/(2*PI*values->f*values->X2_1);
- values->C1_2=-1/(2*PI*values->f*values->X1_2);
- values->L2_2=values->X2_2/(2*PI*values->f);
- }
- else
- {
- fprintf(stderr,"Internal error 100 in 'design_FET_amp'\n Exiting ...\n");
- exit(100);
- }
- /* Compute S' of FET and input matching network */
- FET.S11.r=device.s11.mag*cos(device.s11.ang*PI/180.0);
- FET.S11.i=device.s11.mag*sin(device.s11.ang*PI/180.0);
- FET.S12.r=device.s12.mag*cos(device.s12.ang*PI/180.0);
- FET.S12.i=device.s12.mag*sin(device.s12.ang*PI/180.0);
- FET.S21.r=device.s21.mag*cos(device.s21.ang*PI/180.0);
- FET.S21.i=device.s21.mag*sin(device.s21.ang*PI/180.0);
- FET.S22.r=device.s22.mag*cos(device.s22.ang*PI/180.0);
- FET.S22.i=device.s22.mag*sin(device.s22.ang*PI/180.0);
- /* series L or C */
- input_Z.r=0.0; input_Z.i=values->X1_1;
- series_element=series_Z_to_S_par(values->Zo, input_Z);
- /* parallel L or C */
- input_Z.r=0.0; input_Z.i=values->X2_1;
- parallel_element=parallel_Z_to_S_par(values->Zo, input_Z);
- S_ip_matching=S1_and_S2_to_S(series_element,parallel_element);
- newS=S1_and_S2_to_S(S_ip_matching, FET);
- values->C2=1e-13; /* 0.1pF */
- do{
- values->C2=values->C2*3.1622777;
- x=1.0/(2.0*PI* values->f * values->C2);
- }while(x>100.0);
- /* C2's efffect on newS */
- temp.r=0.0; temp.i=-x;
-
- newS=series_Z_to_new_S(Zo, newS, temp);
- /* Add effect of stabilising resistor */
- temp.r=values->R3; temp.i=0.0;
- newS=parallel_Z_to_new_S(Zo, newS, temp);
- S_to_lump(values->Zo,newS.S22,&zout);
- values->X3_1=0.0; values->X3_2=0.0;
- values->X4_1=0.0; values->X4_2=0.0;
- calculate_L_network(values->Zo,0.0,zout.r, -zout.i, &values->X3_1, &values->X3_2, &values->X4_1, &values->X4_2, swap);
- if(*swap==TRUE)
- {
- calculate_L_network(zout.r, zout.i, values->Zo,-0.0,&values->X3_1, &values->X3_2, &values->X4_1, &values->X4_2, swap);
- *swap=TRUE;
- }
- if(values->X3_1 >= 0.0) /* X3 inductive */
- values->L3_1=values->X3_1/(2*PI*values->f);
- if(values->X3_1<0.0)
- values->C3_1=-1/(2*PI*values->f*values->X3_1);
- if(values->X3_2 >= 0.0) /* X3 inductive */
- values->L3_2=values->X3_2/(2*PI*values->f);
- if(values->X3_2<0.0)
- values->C3_2=-1/(2*PI*values->f*values->X3_2);
- if(values->X4_1 >= 0.0) /* X4 inductive */
- values->L4_1=values->X4_1/(2*PI*values->f);
- if(values->X4_1<0.0)
- values->C4_1=-1/(2*PI*values->f*values->X4_1);
- if(values->X4_2 >= 0.0) /* X1 inductive */
- values->L4_2=values->X4_2/(2*PI*values->f);
- if(values->X4_2<0.0)
- values->C4_2=-1/(2*PI*values->f*values->X4_2);
- /* Assume _1's used. Find the final S parameters of network */
- if(*swap==FALSE)
- {
- temp.r=0.0; temp.i=values->X4_1;
- newS=parallel_Z_to_new_S(Zo, newS, temp); /* parallel X4 */
- temp.r=0.0; temp.i=values->X3_1;
- newS=series_Z_to_new_S(Zo, newS, temp); /* series X3 */
- }
- else if(*swap==TRUE)
- {
- temp.r=0.0; temp.i=values->X3_1;
- newS=series_Z_to_new_S(Zo, newS, temp); /* series X3 */
-
- temp.r=0.0; temp.i=values->X4_1;
- newS=parallel_Z_to_new_S(Zo, newS, temp); /* parallel X4 */
- }
- if(what =='G' || what == 'g')
- {
-
- if(*swap==TRUE)
- {
-
- }
- else if(*swap== FALSE )
- {
-
- }
- }
- return(newS);
- }
-
-
- struct S_parameters parallel_Z_to_new_S(double Zo, struct S_parameters old, struct FCOMPLEX z)
- {
- struct S_parameters new, parallel_element;
-
- parallel_element=parallel_Z_to_S_par(Zo, z);
- new=S1_and_S2_to_S(old,parallel_element);
- return(new);
- }
-
- struct S_parameters series_Z_to_new_S(double Zo, struct S_parameters old, struct FCOMPLEX z)
- {
- struct S_parameters new, series_element;
-
- series_element=series_Z_to_S_par(Zo, z);
- new=S1_and_S2_to_S(old,series_element);
- return(new);
- }
-
- void print_FET_component_values(struct components values, struct S_parameters S)
- {
- int p, row=1;
- struct S Snew;
- p=getpage();
- goxy(row,45,p);
- printf("F=%.2lf MHz\n", values.f/1e6);
- goxy(++row,45,p);
- printf("Zo=%.1lf %c\n", values.Zo, 234);
- goxy(++row,45,p);
- printf("Vcc=%.1lf V\n",values.Vcc);
- goxy(++row,45,p);
- printf("Id=%.1lf mA\n",values.Id*1000);
- goxy(++row,45,p);
- printf("Vds=%.1lf V\n",values.Vds);
- goxy(++row,45,p);
- printf("Vgs=%.1lf V\n",values.Vgs);
- goxy(++row,45,p);
- printf("R1=%.1lf Ω\n",values.R1);
- goxy(++row,45,p);
- printf("R2=%.1lf Ω\n",values.R2);
- goxy(++row,45,p);
- printf("R3=%.1lf Ω\n",values.R3);
- goxy(++row,45,p);
- printf("Cd ≥ %.1lf pF\n",values.Cd*1e12);
- goxy(++row,45,p);
- printf("{X1=%.1lf nH AND ",values.L1_1*1e9);
- printf("X2=%.2lf pF} OR\n",values.C2_1*1e12);
- goxy(++row,45,p);
- printf("{X1=%.2lf pF AND ", values.C1_2*1e12);
- printf("X2=%.1lf nH}\n", values.L2_2*1e9);
- goxy(++row,45,p);
- printf("C2=%.2lf pF\n",values.C2*1e12);
- goxy(++row,45,p);
- printf("{X3=%.1lf nH AND ",values.L3_1*1e9);
- printf("X4=%.2lf pF} OR\n",values.C4_1*1e12);
- goxy(++row,45,p);
- printf("{X3=%.2lf pF AND ", values.C3_2*1e12);
- printf("X4=%.1lf nH}\n", values.L4_2*1e9);
- row++;
- goxy(row++,45,p);
- Snew=cartessian_to_cylindrical(S);
- printf("S11 = %.3lf(dB) @ %.2lf°\n", Snew.s11.magdB, Snew.s11.ang);
- goxy(row++,45,p);
- printf("S12 = %.3lf(dB) @ %.2lf°\n", Snew.s12.magdB, Snew.s12.ang);
- goxy(row++,45,p);
- printf("S21 = %.3lf(dB) @ %.2lf°\n", Snew.s21.magdB, Snew.s21.ang);
- goxy(row++,45,p);
- printf("S22 = %.3lf(dB) @ %.2lf°\n", Snew.s22.magdB, Snew.s22.ang);
- goxy(row++,45,p);
- printf("VSWRin = %.3lf:1\n", (1+Snew.s11.mag)/(1-Snew.s22.mag));
- goxy(row++,45,p);
- printf("VSWRout = %.3lf:1\n", (1+Snew.s22.mag)/(1-Snew.s22.mag));
- }
-
- #endif
-